#include <ArduinoJson.h>

void setup()
{
    Serial.begin(9600);
    Serial.println("");

    // 重点1：DynamicJsonDocument对象
    const size_t capacity = JSON_OBJECT_SIZE(2) + 30;
    DynamicJsonDocument doc(capacity);

    // 重点2：即将解析的json文件
    String json = "{\"name\":\"taichi-maker\",\"number\":1}";

    // 重点3：反序列化数据
    deserializeJson(doc, json);

    // 重点4：获取解析后的数据信息
    String nameStr = doc["name"].as<String>();
    int numberInt = doc["number"].as<int>();

    // 通过串口监视器输出解析后的数据信息
    Serial.print("nameStr = ");
    Serial.println(nameStr);
    Serial.print("numberInt = ");
    Serial.println(numberInt);
}

void loop() {}

/*
    重点1：
    const size_t capacity = JSON_OBJECT_SIZE(2) + 30;
    DynamicJsonDocument doc(capacity);
    这里我们建立了DynamicJsonDocument对象，该对象名称为doc。
    在建立该对象时需要提供一个参数，也就是括号中的参数capacity。
    这个capacity参数的作用是告诉ESP8266我们所建立的DynamicJsonDocument对象将要占用多大的内存空间。
    这个空间大小是由语句const size_t capacity = JSON_OBJECT_SIZE(2) + 30;计算出来的。
    在这里我们回顾一下需要解析的JSON信息内容如下所示：

    {
    "name": "taichi-maker",
    "number": 1
    }
    我们可以看到，以上JSON信息中包含一个对象，该对象含有两个数据。
    因此在计算DynamicJsonDocument对象占用空间大小时，使用了JSON_OBJECT_SIZE(2)这条指令。
    其中指令括号中的2即代表对象包含有两个数据。 
    ===============================================================================
    我们再看一个例子，假设我们即将解析的JSON如下：
    {
    "name": "taichi-maker",
    "url": "www.taichi-maker.com",
    "number": 1
    }
    以上JSON对象中包含有3个数据。在计算解析它所需要占用的内存大小时，我们将要使用语句:
    const size_t capacity = JSON_OBJECT_SIZE(3) + 60;

    讲到这里可能细心的朋友已经发现了，在以上语句中除了JSON_OBJECT_SIZE指令以外。
    还使用+ 60来额外增加数值。
    这些额外增加的数值是由于ArduinoJson库在解析信息时，需要额外的空间来复制JSON信息。
    但是具体这个额外增加的数值是多少呢，
*/